#ifndef __LINUX_FTP_H__
#define __LINUX_FTP_H__

#include <time.h>
#include "linux_socket.h"

#define FTP_BUFSIZE 2048

#ifdef __cplusplus
extern "C"
{
#endif

typedef struct{
	char type;
	int  access_mode;
	int  subdir_count;		
	char owner[20];		
	char group[20];		
	int  size;
	char datetime[16];	
	char filename[128];
	char linkname[128];
} SFtp_FtpList;

typedef struct{
	ftp_scoket CommandChunnel;
	ftp_scoket DataChunnel;
	char strSystemType[64];
	//SFtp_FtpList* pFtpList;
	int  nFtpListCount;
	int  nTransferMode;
	int  nTransferType;
	int  nMsTimeOut;
	int  nReplyCode;
	char szReplyString[FTP_BUFSIZE];
} SFtp_Ftp;

typedef struct
{
	char			strIP[20];			/*FTP服务端IP地址*/
	unsigned int	iPort;				/*FTP服务端端口号*/
	char			strUserName[10];	/*登陆FTP服务端的用户名*/
	char			strPassWord[10];	/*登陆FTP服务端的密码*/
	char			strFilePath[32];	/*远程文件存放路径*/
}SFtpServerInfo;

typedef struct {
	char fileName[100];
	char dirName[300];
	char *fileMem;
	char fileLen;
} SFileInfo;

enum { FPD_TypeAscii = 1, FPD_TypeBinary = 2 };
enum { FPD_ModePort = 1, FPD_ModePassive = 2 };

SFtp_Ftp* Ftp_Connect(const char* lpszHostAddress, const char* lpszUser, const char* lpszPassword);
#define FPF_FtpClose(ftp) { FtpClose(ftp); ftp = NULL; }
void Ftp_Close(SFtp_Ftp* ftp);
	
bool Ftp_SetTransferType(SFtp_Ftp* ftp, int nType);
void Ftp_SetTransferMode(SFtp_Ftp* ftp, int nMode);
void Ftp_SetTimeOut(SFtp_Ftp* ftp, int nMsTimeOut);

bool Ftp_GetCurrentDirectory(SFtp_Ftp* ftp, char* lpszCurrentDirectory);
bool Ftp_SetCurrentDirectory(SFtp_Ftp* ftp, const char* lpszCurrentDirectory);
bool Ftp_CreateDirectory(SFtp_Ftp* ftp, const char* lpszDirectory);
bool Ftp_RemoveDirectory(SFtp_Ftp* ftp, const char* lpszDirectory);
bool Ftp_GetFile(SFtp_Ftp* ftp, const char* lpszRemoteFile, const char* lpszNewFile);
//根据大小上传缓冲区中的数据到文件
int Ftp_SendBuff(SFtp_Ftp* ftp, int BuffSize,  char * pBuff, const char* lpszNewRemoteFile);
int Ftp_PutFile(SFtp_Ftp* ftp, const char* lpszLocalFile, const char* lpszNewRemoteFile);
bool Ftp_RenameFile(SFtp_Ftp* ftp, const char* lpszExisting, const char* lpszNew);
bool Ftp_DeleteFile(SFtp_Ftp* ftp, const char* lpszFileName);

int  Ftp_GetFileSize(SFtp_Ftp* ftp, const char* lpszRemoteFile);
bool Ftp_GetFileTime(SFtp_Ftp* ftp, const char* lpszRemoteFile, struct tm* ptmFileTime);
int  Ftp_List(SFtp_Ftp* ftp, const char* lpszPathName, bool bIsFullList, SFtp_FtpList** ppFtpList);
void Ftp_CloseList(SFtp_Ftp* ftp);

int DirectGotoDir(SFtp_Ftp* m_ftp,char* alldir);
int checkdir(SFtp_Ftp* m_ftp,char* rootdir);
int UploadViaFTP(char * ip, char * name, char * passwd, char * filename, char * directory,char *data,int size);

/* FTP上传的出错类型 */
typedef enum FTPError_t {
	MKD_257_,		/* 创建目录错误 */
	PASS_230_,		/* 密码错误 */
	USER_331_,		/* 用户名错误 */
	STOR_150_,		/* 写文件错误 */
	PORT_220_,		/* 请求数据连接错误 */
	RNFR_350_,		/* 需要重命名的临时文件不存在 */
	RNTO_250_,		/* 无法重命名临时文件到指定文件名 */
	Recv_226_,		/* 上传文件不完整 */
	Conn_Error		/* 连接服务器错误 */
} FTPError_t;

#ifdef __cplusplus
}
#endif
#endif
